#!/usr/bin/env python3
"""
转码任务标签页组件

实现转码任务管理界面，包括：
- 整体任务概览（紧凑单行显示）
- 分设备任务详情显示（垂直排列）
- 实时进度监控
"""

from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel, 
                             QProgressBar, QFrame, QScrollArea, QGroupBox)
from PyQt6.QtCore import Qt, QTimer, QPropertyAnimation, pyqtProperty
from PyQt6.QtGui import QFont, QPalette, QColor, QPainter, QRadialGradient


class TaskOverviewWidget(QWidget):
    """任务概览组件 - 紧凑单行显示"""
    
    def __init__(self, parent=None):
        super().__init__(parent)
        self.init_ui()
    
    def init_ui(self):
        """初始化界面"""
        layout = QHBoxLayout(self)
        
        # 任务统计 - 紧凑单行显示
        self.tasks_summary_label = QLabel("正在执行任务：CPU:0 集显:0 独显:0")
        self.tasks_summary_label.setFont(QFont("Arial", 10))
        layout.addWidget(self.tasks_summary_label)
        
        layout.addStretch()  # 添加弹性空间
        
        # 整体进度信息
        self.progress_label = QLabel("已完成:0 正在转码:0 等待:200 (0.00%)")
        self.progress_label.setFont(QFont("Arial", 10))
        layout.addWidget(self.progress_label)
    
    def update_stats(self, stats):
        """更新任务统计"""
        cpu_count = stats.get('cpu', 0)
        igpu_count = stats.get('igpu', 0)
        dgpu_count = stats.get('dgpu', 0)
        total_tasks = cpu_count + igpu_count + dgpu_count
        
        # 更新任务统计
        task_text = f"正在执行任务："
        if cpu_count > 0:
            task_text += f"CPU:{cpu_count} "
        if igpu_count > 0:
            task_text += f"集显:{igpu_count} "
        if dgpu_count > 0:
            task_text += f"独显:{dgpu_count}"
        
        if total_tasks == 0:
            task_text = "正在执行任务：无"
            
        self.tasks_summary_label.setText(task_text)
        
        # 更新进度信息
        completed = stats.get('completed', 20)
        processing = stats.get('processing', 6)
        waiting = stats.get('waiting', 200)
        
        total = completed + processing + waiting
        if total > 0:
            progress_percent = (completed / total) * 100
            progress_text = f"已完成:{completed} 正在转码:{processing} 等待:{waiting} ({progress_percent:.2f}%)"
        else:
            progress_text = "已完成:0 正在转码:0 等待:0 (0.00%)"
            
        self.progress_label.setText(progress_text)


class DeviceTaskList(QWidget):
    """设备任务列表组件 - 水平布局，标签在前方居中"""
    
    def __init__(self, device_type, parent=None):
        super().__init__(parent)
        self.device_type = device_type
        self.init_ui()
    
    def init_ui(self):
        """初始化界面"""
        # 创建水平布局
        layout = QHBoxLayout(self)
        layout.setContentsMargins(5, 5, 5, 5)
        
        # 设备标签 - 前方居中显示
        device_titles = {
            'cpu': 'CPU任务',
            'igpu': '集显任务', 
            'dgpu': '独显任务'
        }
        
        self.device_label = QLabel(device_titles.get(self.device_type, '任务'))
        self.device_label.setFixedWidth(80)  # 固定宽度确保对齐
        self.device_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.device_label.setStyleSheet("""
            QLabel {
                font-weight: bold;
                font-size: 12px;
                color: #333;
                background-color: #f0f0f0;
                border: 1px solid #ccc;
                border-radius: 4px;
                padding: 5px;
            }
        """)
        layout.addWidget(self.device_label)
        
        # 任务列表区域 - 使用QFrame作为容器
        self.tasks_frame = QFrame()
        self.tasks_frame.setStyleSheet("""
            QFrame {
                border: 2px solid #ccc;
                border-radius: 8px;
                background-color: #f8f9fa;
            }
        """)
        
        tasks_frame_layout = QVBoxLayout(self.tasks_frame)
        tasks_frame_layout.setContentsMargins(10, 10, 10, 10)
        
        # 任务列表区域
        self.tasks_area = QWidget()
        self.tasks_layout = QVBoxLayout(self.tasks_area)
        self.tasks_layout.setSpacing(5)
        tasks_frame_layout.addWidget(self.tasks_area)
        
        # 暂无任务提示
        self.placeholder_label = QLabel("暂无任务")
        self.placeholder_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.placeholder_label.setStyleSheet("color: #999; font-style: italic;")
        self.tasks_layout.addWidget(self.placeholder_label)
        
        layout.addWidget(self.tasks_frame, 1)  # 设置拉伸因子为1
    
    def update_tasks(self, tasks):
        """更新任务列表"""
        # 清空现有任务
        for i in reversed(range(self.tasks_layout.count())):
            widget = self.tasks_layout.itemAt(i).widget()
            if widget and widget != self.placeholder_label:
                widget.deleteLater()
        
        if not tasks:
            self.placeholder_label.show()
            return
        
        self.placeholder_label.hide()
        
        # 添加任务项
        for task in tasks:
            task_widget = EnhancedTaskItemWidget(task)
            self.tasks_layout.addWidget(task_widget)


class InlineInfoProgressBar(QProgressBar):
    """内嵌信息进度条 - 所有信息集成在一个进度条内显示，带发光闪烁效果"""
    
    def __init__(self, task_data, parent=None):
        super().__init__(parent)
        self.task_data = task_data
        self.setMinimum(0)
        self.setMaximum(100)
        self.setValue(int(self.task_data.get('progress', 10)))
        self.setTextVisible(False)
        self.setMinimumHeight(30)  # 设置最小高度，允许窗口调整
        
        # 发光效果动画
        self.glow_alpha = 255
        self.glow_timer = QTimer(self)
        self.glow_timer.timeout.connect(self.update_glow_effect)
        self.glow_timer.start(100)  # 每100毫秒更新一次
        
        # 设置基本样式
        self.setStyleSheet("""
            QProgressBar {
                border: 1px solid #999;
                border-radius: 4px;
                background-color: #f0f0f0;
            }
            QProgressBar::chunk {
                background-color: #4CAF50;
                border-radius: 3px;
            }
        """)
    
    def update_glow_effect(self):
        """更新发光效果动画"""
        # 使用正弦函数创建呼吸灯效果
        import math
        import time
        current_time = time.time()
        # 0.5秒周期，从0到255再到0
        self.glow_alpha = int(128 + 127 * math.sin(current_time * 4 * math.pi))
        self.update()  # 触发重绘
    
    def paintEvent(self, event):
        """重写绘制事件，在进度条内部绘制所有信息"""
        super().paintEvent(event)
        
        painter = QPainter(self)
        painter.setRenderHint(QPainter.RenderHint.Antialiasing)
        
        # 获取进度条尺寸
        width = self.width()
        height = self.height()
        progress_width = int(width * self.value() / 100)
        
        # 准备文本信息
        filename = self.task_data.get('filename', '未知文件')
        if len(filename) > 15:
            display_name = filename[:15] + '...'
        else:
            display_name = filename
        
        current_time = self.task_data.get('current_time', '00:02:00.87')
        total_time = self.task_data.get('total_time', '00:07:16.94')
        progress_percent = self.task_data.get('progress', 10)
        speed = self.task_data.get('speed', '25.7x')
        bitrate = self.task_data.get('bitrate', '2014.2kbits/s')
        fps = self.task_data.get('fps', '616')
        
        # 构建带说明的显示文本 - 所有任务显示完整信息
        filename_text = f"文件名：{display_name}"
        current_time_text = f"已转码时长：{current_time}"
        total_time_text = f"总时长：{total_time}"
        progress_text = f"进度：{progress_percent}%"
        speed_text = f"速度：{speed}"
        bitrate_text = f"比特率：{bitrate}"
        fps_text = f"FPS：{fps}"
        
        # 设置字体
        font = QFont("Arial", 8)
        painter.setFont(font)
        
        # 文件名居左显示
        painter.setPen(QColor("#333"))
        painter.drawText(10, 20, filename_text)
        
        # 右侧信息固定布局 - 所有数据项都显示
        right_x = width - 10  # 右侧起始位置
        
        # FPS信息（最右侧）
        fps_width = painter.fontMetrics().horizontalAdvance(fps_text)
        painter.drawText(right_x - fps_width, 20, fps_text)
        right_x -= (fps_width + 15)
        
        # 比特率信息
        bitrate_width = painter.fontMetrics().horizontalAdvance(bitrate_text)
        painter.drawText(right_x - bitrate_width, 20, bitrate_text)
        right_x -= (bitrate_width + 15)
        
        # 速度信息
        speed_width = painter.fontMetrics().horizontalAdvance(speed_text)
        painter.drawText(right_x - speed_width, 20, speed_text)
        right_x -= (speed_width + 15)
        
        # 进度信息
        progress_width_text = painter.fontMetrics().horizontalAdvance(progress_text)
        painter.drawText(right_x - progress_width_text, 20, progress_text)
        right_x -= (progress_width_text + 15)
        
        # 总时长信息
        total_time_width = painter.fontMetrics().horizontalAdvance(total_time_text)
        painter.drawText(right_x - total_time_width, 20, total_time_text)
        right_x -= (total_time_width + 15)
        
        # 已转码时长信息
        current_time_width = painter.fontMetrics().horizontalAdvance(current_time_text)
        painter.drawText(right_x - current_time_width, 20, current_time_text)
        
        # 绘制发光闪烁效果 - 在进度条绿色部分最右侧
        if progress_width > 10:  # 确保有足够的进度空间
            # 发光点的位置（进度条绿色部分最右侧）
            glow_x = progress_width - 5  # 稍微向内偏移，避免超出边界
            glow_y = height // 2  # 垂直居中
            
            # 创建径向渐变发光效果
            gradient = QRadialGradient(glow_x, glow_y, 8)  # 中心点，半径8
            
            # 中心颜色（黄色，根据alpha值变化）
            center_color = QColor(255, 255, 0, self.glow_alpha)  # 黄色，带透明度
            gradient.setColorAt(0, center_color)
            
            # 边缘颜色（绿色，透明度为0）
            edge_color = QColor(76, 175, 80, 0)  # 进度条绿色，完全透明
            gradient.setColorAt(1, edge_color)
            
            # 设置画笔
            painter.setBrush(gradient)
            painter.setPen(Qt.PenStyle.NoPen)
            
            # 绘制发光圆点
            painter.drawEllipse(int(glow_x - 4), int(glow_y - 4), 8, 8)
            
            # 绘制一个小的白色亮点在中心
            painter.setBrush(QColor(255, 255, 255, min(255, self.glow_alpha + 100)))
            painter.drawEllipse(int(glow_x - 2), int(glow_y - 2), 4, 4)
        
        # 绘制发光闪烁效果 - 在进度条绿色部分最右侧
        if progress_width > 10:  # 确保有足够的进度空间
            # 发光点的位置（进度条绿色部分最右侧）
            glow_x = progress_width - 5  # 稍微向内偏移，避免超出边界
            glow_y = height // 2  # 垂直居中
            
            # 创建径向渐变发光效果
            gradient = QRadialGradient(glow_x, glow_y, 8)  # 中心点，半径8
            
            # 中心颜色（黄色，根据alpha值变化）
            center_color = QColor(255, 255, 0, self.glow_alpha)  # 黄色，带透明度
            gradient.setColorAt(0, center_color)
            
            # 边缘颜色（绿色，透明度为0）
            edge_color = QColor(76, 175, 80, 0)  # 进度条绿色，完全透明
            gradient.setColorAt(1, edge_color)
            
            # 设置画笔
            painter.setBrush(gradient)
            painter.setPen(Qt.PenStyle.NoPen)
            
            # 绘制发光圆点
            painter.drawEllipse(int(glow_x - 4), int(glow_y - 4), 8, 8)
            
            # 绘制一个小的白色亮点在中心
            painter.setBrush(QColor(255, 255, 255, min(255, self.glow_alpha + 100)))
            painter.drawEllipse(int(glow_x - 2), int(glow_y - 2), 4, 4)


class EnhancedTaskItemWidget(QWidget):
    """增强版单个任务项组件 - 单一进度条内嵌所有信息"""
    
    def __init__(self, task_data, parent=None):
        super().__init__(parent)
        self.task_data = task_data
        self.init_ui()
    
    def init_ui(self):
        """初始化界面"""
        layout = QVBoxLayout(self)
        layout.setContentsMargins(2, 2, 2, 2)
        
        # 创建内嵌信息进度条
        self.progress_bar = InlineInfoProgressBar(self.task_data)
        
        # 设置悬停提示
        filename = self.task_data.get('filename', '未知文件')
        current_time = self.task_data.get('current_time', '00:02:00.87')
        total_time = self.task_data.get('total_time', '00:07:16.94')
        progress_percent = self.task_data.get('progress', 10)
        speed = self.task_data.get('speed', '25.7x')
        bitrate = self.task_data.get('bitrate', '2014.2kbits/s')
        fps = self.task_data.get('fps', '616')
        
        tooltip_text = f"""文件名: {filename}
已转码时长: {current_time}
总时长: {total_time}
进度: {progress_percent}%
速度: {speed}
比特率: {bitrate}
FPS: {fps}"""
        
        self.progress_bar.setToolTip(tooltip_text)
        
        layout.addWidget(self.progress_bar)


class TranscodeTasksTab(QWidget):
    """转码任务标签页 - 垂直布局"""
    
    def __init__(self, parent=None):
        super().__init__(parent)
        self.init_ui()
    
    def init_ui(self):
        """初始化界面"""
        layout = QVBoxLayout(self)
        
        # 任务概览 - 紧凑单行显示
        self.overview_widget = TaskOverviewWidget()
        layout.addWidget(self.overview_widget)
        
        # 任务详情区域
        details_layout = QVBoxLayout()
        details_layout.setSpacing(10)  # 设置间距
        
        # 设备任务列表区域 - 垂直排列
        # CPU任务列表
        self.cpu_tasks = DeviceTaskList('cpu')
        details_layout.addWidget(self.cpu_tasks)
        
        # 集显任务列表
        self.igpu_tasks = DeviceTaskList('igpu')
        details_layout.addWidget(self.igpu_tasks)
        
        # 独显任务列表
        self.dgpu_tasks = DeviceTaskList('dgpu')
        details_layout.addWidget(self.dgpu_tasks)
        
        layout.addLayout(details_layout)
        
        # 添加弹性空间
        layout.addStretch()
    
    def update_task_data(self, task_data):
        """更新任务数据"""
        # 更新概览
        self.overview_widget.update_stats(task_data.get('stats', {}))
        
        # 更新各设备任务列表
        self.cpu_tasks.update_tasks(task_data.get('cpu_tasks', []))
        self.igpu_tasks.update_tasks(task_data.get('igpu_tasks', []))
        self.dgpu_tasks.update_tasks(task_data.get('dgpu_tasks', []))